﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.Xml;

namespace GameVLTK
{
    public abstract class MoveableUnit : Unit
    {
        //Ẩn hay hiện trên màn hình
        protected bool _IsVisible;

        public bool IsVisible
        {
            get { return _IsVisible; }
            set { _IsVisible = value; }
        }

        //Máu của Unit
        protected int _Hp;
        public virtual int HP
        {
            get { return _Hp; }
            set { 
                _Hp = value;
                this.HealthBar.NumberOfHealthDots = (int)(value * 0.19f) + 1;
            }
        }

        //Thanh Health Bar
        protected HealthBar _HealthBar;

        public HealthBar HealthBar
        {
            get { return _HealthBar; }
            set { _HealthBar = value; }
        }

        //Danh sách các Ánh hào quan 
        protected List<Aura> _Auras;

        public List<Aura> Auras
        {
            get { return _Auras; }
            set { _Auras = value; }
        }

        //Aura hiện tại mà Player đang sử dụng
        protected int _CurrentAura;

        public int CurrentAura
        {
            get { return _CurrentAura; }
            set { _CurrentAura = value; }
        }

        //Cho biết có đang di chuyển hay không
        protected bool _IsMoving;
        public bool IsMoving
        {
            get { return _IsMoving; }
            set { _IsMoving = value; }
        }

        //Module di chuyển nhân vật
        protected PlaneMotionModule _MotionModule;

        public PlaneMotionModule MotionModule
        {
            get { return _MotionModule; }
            set { _MotionModule = value; }
        }

        //Danh sách các skill của người chơi
        protected List<Skill> _Skills;

        public List<Skill> Skills
        {
            get { return _Skills; }
            set { _Skills = value; }
        }

        //Skill hiện tại mà Player đang sử dụng
        protected int _CurrentSkill;

        public int CurrentSkill
        {
            get { return _CurrentSkill; }
            set { _CurrentSkill = value; }
        }

        //Cho biết người chơi có đang sử dụng Skill hay không?
        protected bool _IsSkillActive;

        public bool IsSkillActive
        {
            get { return _IsSkillActive; }
            set { _IsSkillActive = value; }
        }

        //Thời gian mỗi lần đánh con Killer
        protected int _TimeOld;

        public int TimeOld
        {
            get { return _TimeOld; }
            set { _TimeOld = value; }
        }

        //


        public MoveableUnit() 
        {
           
        }

        public MoveableUnit(ContentManager content, XmlDocument doc)
        {
            this.IsVisible = true;

            //Thanh Health Bar cho các đối tượng di chuyển
            XmlNode nHealthBar = doc.SelectSingleNode("//HEALTHBAR");
            String healthBar = Global.PATH_IMAGES + nHealthBar.Attributes["Prefix"].Value;
            String healthBarPath = healthBar + nHealthBar.ChildNodes[0].Attributes["Prefix"].Value;
            String healthDotPath = healthBar + nHealthBar.ChildNodes[1].Attributes["Prefix"].Value;
            this.HealthBar = new HealthBar(content, healthBarPath, healthDotPath, this.TopLeft);


            this.MotionModule = new PlaneMotionModule();
        }


        protected Texture2D[] LoadTextures(ContentManager _content, string _path,
                          int _nTextures, int state)
        {
            //Tính số texture cho mỗi hướng 
            this._FrameOfThatDirs[state] = _nTextures / Global.NUM_OF_DIRECTIONS;

            Texture2D[] textures;
            textures = new Texture2D[_nTextures];

            for (int i = 0; i < _nTextures; i++)
            {
                textures[i] = _content.Load<Texture2D>(_path + (i + 1).ToString("00"));
            }
            return textures;
        }


       
        /// <summary>
        /// Cho Player di chuyển từ vị trí đang đứng đến vị trí có tọa độ (fx, fy)
        /// </summary>
        protected void GoToLogicalXY(Vector2 topLeft_B)
        {
            //Tính ra hướng của nhân vật dựa vào gốc quay của nhân vật
            int dir = CalDirection(topLeft_B);

            //Lưu lại hướng di chuyển trước đó của nhân vật
            this.PrevDirection = this.CurrentDirection;

         
            //Trường hợp hướng cần di chuyển là hướng # so với hướng hiện tại thì
            //cập nhật lại
            if (this.PrevDirection != dir)
                this.CurrentDirection = dir;

            MotionModule.Stop();
            MotionModule = new MovingPlaneMotionModule(_V.X, _V.Y,//Vận tốc cần di chuyển
                                                         _fLen, //Quãng đường cần di chuyển
                                                         this, //Đối tượng di chuyển
                                                         dir); //Hướng cần di chuyển
            MotionModule.Play();

        }

       

    }
}
